#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>

/*
@实现读取对应fd文件中的一行数据存放到buf中
@返回值：n表示读到的一行数据个数（n>=0）,
*/
static int read_line(int fd,unsigned char *buf)
{
	/*循环读入一个字符*/
	/*当读到0x0d,0x0a时，表示已读完一行*/
	unsigned char c;
	int len;//数据个数
	int i = 0;//buf写入位置
	int err = 0;//标志位
	while (1)
	{
		len = read(fd,&c,1);
		if(len<=0) //读取错误 and 读到空数据
		{
			err = -1;
			break;
		}			
		else //读数据
		{
			if(c != '\n' && c!='\r') //不等于 换行 && 回车
			{
				buf[i++] = c;
			}
			else //遇到回车换行，表示已经读完
			{
				err=0;
				break;
			}
		}
	}
	buf[i] = '\0';
	
	if(err == -1 && i == 0)//读取错误 && 未读到数据
	{
		return -1;
	}
	else //读到数据
	{
		return i;
	}	
}

/*
@对于原先数据，只需拷贝过去，并在此基础上添加求和和评价
*	示例1：data_buf = ",语文,数学,英语,总分,评价"
*		   result_buf = ",语文,数学,英语,总分,评价"
*	示例2：data_buf = "张三,90,91,92,,"
*		   result_buf = "张三,90,91,92,273,A+"
*/
int process_data(unsigned char* data_buf,unsigned char* result_buf)
{
	char name[100];
	int scores[3];
	int sum;
	char *levels[] = {"B","A","A+"};//大于270，大于240，小于240
	
	if(data_buf[0] == ',')  //对于UTF-8编码的文件，它的前三个字符是 0xef 0xbb 0xbf
		strcpy(result_buf,data_buf);
	else
	{
		// %[^,] 取非‘,’的内容，直到遇到‘,’
		sscanf(data_buf,"%[^,],%d,%d,%d,",name,&scores[0],&scores[1],&scores[2]);//从字符串里面得到数据
		//printf("result:%s,%d,%d,%d\n\r",name,scores[0],scores[1],scores[2]);
		sum = scores[0]+scores[1]+scores[2];//求和

		//存入数据
		/* levels[(sum-210)/30] */ 		/*printf("level:%s",levels[(sum-210)/30]);*/
		sprintf(result_buf,"%s,%d,%d,%d,%d,%s",name,scores[0],scores[1],scores[2],sum,levels[(sum-210)/30]);	
		//printf("result:%s",result_buf);
	}
	
}


/*
输入：	./process_excel data.csv result.csv
解析： argc = 3
	   argv[0] = "./process_excel"
	   argv[1] = "data.csv"
	   argv[2] = "result.csv"
*/
int main(int argc,char **argv)
{
	int fd_data,fd_result;
	unsigned char data_buf[1000];
	unsigned char result_buf[1000];
	int len;
	if(argc!=3)
	{
		printf("usage:%s <data csv file><result csv file>\n",argv[0]);
		return -1;
	}
	//打开data文件
	fd_data = open(argv[1], O_RDONLY); 
	if(fd_data<0){
		printf("can not open file %s\n",argv[1]);//打印报错
		perror("open");//打印错误	
		return -1;
	}
	else
	{
		printf("data file fd = %d\n",fd_data);
	}
	//创建result文件
	fd_result = open(argv[2], O_RDWR|O_CREAT|O_TRUNC,0644);
	if(fd_result<0){
		printf("can not create file %s\n",argv[1]);//打印报错
		perror("create");//打印错误	
		return -1;
	}
	else
	{
		printf("result file fd = %d\n",fd_result);
	}

	//指定位置写入
	while(1)
	{
		/*从数据文件里读取一行*/
		len = read_line(fd_data,data_buf);
		if(len == -1) //未读到数据
		{
			break;
		}
		if(len !=0)
		{
			/*处理数据*/
			//printf("line：%s\n\r",data_buf);
			process_data(data_buf,result_buf);
			
			/*写入result文件*/
			write(fd_result,result_buf,strlen(result_buf));
			write(fd_result,"\r\n",2);
		}		
	}
	close(fd_data);
	close(fd_result);
	return 0;	
}



